  
### URI - Унифицированный идентификатор ресурса  
Uniform Resource Identifier (**URI**) - это строка символов, используемая идентификации имени или ресурса в Интернете.  
  
**URI** идентифицирует ресурс либо по местоположению, либо по имени, либо по тому и по другому.  
  
**URI** содржит в себе две спецификации, известные как **URL** и **URN**.  
  
### URL - Унифицированный локатор ресурса  
Uniform Resource Locator (**URL**) - это одно из подмножеств Uniform Resource Identifier (**URI**), которое указывает,  
где доступен идентифицируемый ресурс и механихм его извлечения. **URL** определяет как можно получить ресурс.  
Протокол определяет способ извлечения **URL**: `http://`, `https://`, `ftp://` или `smb://`.  
  
**URL** содержит информацию о том, как извлечь ресурс из его местоположения.  
  
Примеры:  
```  
http://example.ru/page.html  
ftp://example.ru/download.zip  
mailto:user@example.ru  
file:///home/user/file.txt  
http://example.ru/resource?foo=bar#fragment  
/other/index.html (Относительный URL используется в контексте другого URL)  
```  
  
##### Структура URL  
В разных объектах разных языков программирования структура описывается разными именами параметров.  
  
Для полного URL-адреса **https://site.ru:8080/path/page?p1=v1&p2=v2#step** схемы имеют разную структуру.  
  
Таблица с описанием шаблона формирования каждого типа   
  
|                    | 'https'      | ://   | 'site.ru' | ':8080' | '/path/page' | '?p1=v1&p2=v2' | '#step'       | 
|--------------------|--------------|-------|-----------|---------|--------------|----------------|---------------| 
| URL() - JavaScript | `[protocol]`   | `[://]` | `[hostname]` | `[:port]` | `[pathname]`   | `[?search]`       | `[#hash]`       |
| URL() - Java       | `[protocol]`   | `[://]` | `[host]`     | `[:port]` | `[path]`      | `[?query]`        | `[#ref]`        |
| URI() - Java       | `[scheme]`     | `[://]` | `[host]`     | `[:port]` | `[path]`      | `[?query]`        | `[#fragment]`    |

Таблица с описанием различных терминов и их соответствия  
  
| Пример                   | JS URL()     | Java URL()    | Java URI()    | Описание                                                       |  
|--------------------------|--------------|---------------|---------------|----------------------------------------------------------------|  
| **https**                | `[protocol]` | `[protocol]`  | `[scheme]`    | Протокол, заканчивается двоеточием `:`                         |  
| **site.ru**              | `[hostname]` | `[host]`      | `[host]`      | Имя сетевого узла (хост)                                       |  
| **site.ru:8080**         | `[host]`     | `[authority]` | `[authority]` | Имя сетевого узла с портом                                     |  
| **https://site.ru:8080** | `[origin]`   |               |               | Параметр `origin`                                              |  
| **:8080**                | `[:port]`    | `[:port]`     | `[:port]`     | Порт, опционален, при указании начинается с двоеточия `:`      |  
| **/path/page**           | `[pathname]` | `[path]`      | `[path]`      | Путь к документу или приложению                                |  
| **?p1=v1&p2=v2**         | `[?search]`  | `[?query]`    | `[?query]`    | Список параметров запроса, начинаются с символа `?`            |  
| **#step**                | `[#hash]`    | `[#ref]`      | `[#fragment]` | Хэш-ссылка для навигации по странице, начинается с символа `#` |  
  
Уточнения:  
> В JS `host` для URL равен:  
>> `[hostname][:port]`  
>   
> В JS `origin` для URL равен:  
>> `[protocol][host] или [protocol]://[hostname][:port]`  
  
> В Java `authority` для URI и URL равен:  
>> `[hostname][:port]`  
  
### URN - Унифицированное имя ресурса  
Uniform Resource Name (**URN**) - это унифицированный идентификатор ресурса (**URN**), который использует схему **URN** и  
не подразумевает доступность идентифицированного ресурса. Как **URN** (имена), так и **URL** (локаторы) являются **URI** и  
конкретный **URI** может быть и именем и локатором одновременно.  
  
**URN** идентифицирует ресурс по имени, он всегда начинается с префикса `urn`.  
  
Примеры:  
```  
url:isbh:0527412654 (идентификация книги по номеру ISBN)  
url:uuid:8795-7454-4E5D8EA (идентификация по уникальному UUID)  
url:publishing:book (простанство имен XML, которое идентифицирует документ как книгу)  
```  
  
##### Структура URN  
```  
[namespace]:[id]:[string]  
  
[namespace] - тип пространства имен  
[id] - идентификатор пространства имен  
[string] - строка, специфичная для протранства имен  
```  
  
### Дополнительно URL и URN
  
`bar.html` это не **URN**. **URN** похоже на имя человека, в то время как **URL** похож на адрес улицы. **URN** определяет  идентификатор чего-либо, в то время как **URL** указывает местоположение. По сути **URN** против **URL** - это "что" против  "где".